﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ModeloMagiPack.Entidades;
using BLLMagiPack.Managers;
using BLLMagiPack.Reporteros;

namespace MaGiPack
{
    public partial class FrmResumenAnual : Form
    {
        private int _añoReporte;
        private List<int> _idsCategoriasReporte;
        private List<BalanceMensual> _reporteAnualCategorias;
        private List<BalanceMensualEstatico> _reporteAnualEstático;

        public FrmResumenAnual()
        {
            InitializeComponent();
        }


        private void CargarAños()
        {
            int año = DateTime.Now.Year;

            cboAño.Items.Clear();

            for (int i = año; i > (año - 20); i--)
                cboAño.Items.Add(i.ToString());

            cboAño.SelectedIndex = 0;
        }

        private void CargarCategorias()
        {
            dgvCategorias.Rows.Clear();

            foreach (Categoria categoria in new BLLCategoria().TraerCategorias().OrderBy(c => c.OrdenReporte).ToList())
                dgvCategorias.Rows.Add(new object[] { categoria.IdCategoria, categoria.Nombre, true });

            ValidarSeleccionCategorias();
        }

        private void MoverFila(bool parriba)
        {
            if (dgvCategorias.SelectedRows.Count == 0)
                return;

            DataGridViewRow filaSeleccionada = dgvCategorias.SelectedRows[0];
            int nuevoIndex = (parriba) ? (filaSeleccionada.Index- 1) : (filaSeleccionada.Index + 2);

            dgvCategorias.Rows.Insert(nuevoIndex, new object[] { filaSeleccionada.Cells[0].Value, filaSeleccionada.Cells[1].Value, filaSeleccionada.Cells[2].Value });
            dgvCategorias.Rows.Remove(filaSeleccionada);

            foreach (DataGridViewRow fila in dgvCategorias.Rows)
                fila.Selected = false;

            if(parriba)
                dgvCategorias.Rows[nuevoIndex].Selected = true;
            else
                dgvCategorias.Rows[nuevoIndex - 1].Selected = true;
        }

        private void ValidarSeleccionCategorias()
        {
            if (dgvCategorias.SelectedRows.Count == 0)
                return;

            btnSubirOrden.Enabled = dgvCategorias.SelectedRows[0].Index > 0;
            btnBajarOrden.Enabled = dgvCategorias.SelectedRows[0].Index < (dgvCategorias.Rows.Count - 1);
        }

        private void GuardarOrdenCategorias()
        {
            List<int> ids = new List<int>();
            _idsCategoriasReporte = new List<int>();

            foreach (DataGridViewRow fila in dgvCategorias.Rows)
            {
                ids.Add(int.Parse(fila.Cells[0].Value.ToString()));

                if (((bool)fila.Cells["ClmIncluir"].Value))
                    _idsCategoriasReporte.Add(ids[ids.Count - 1]);
            }

            new BLLCategoria().ActualizarOrdenCategorias(ids);
        }


        private void FrmResumenAnual_Load(object sender, EventArgs e)
        {
            CargarAños();
            CargarCategorias();
        }

        private void cboAño_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void btnGenerarInforme_Click(object sender, EventArgs e)
        {
            _reporteAnualCategorias = new List<BalanceMensual>();
            _reporteAnualEstático = new List<BalanceMensualEstatico>();

            GuardarOrdenCategorias();
            _añoReporte = int.Parse(cboAño.Text);
            dgvCategorias.Enabled = cboAño.Enabled = btnGenerarInforme.Enabled = false;
            picCargando.Visible = true;
            bgwProcesarReporte.RunWorkerAsync();
        }

        private void bgwProcesarReporte_DoWork(object sender, DoWorkEventArgs e)
        {
            ReporteadorReloaded reportero = new ReporteadorReloaded();
            reportero.GenerarBalanceAnal(_añoReporte, _reporteAnualCategorias, _reporteAnualEstático);
        }

        private void bgwProcesarReporte_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

        }

        private void bgwProcesarReporte_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            dgvCategorias.Enabled = cboAño.Enabled = btnGenerarInforme.Enabled = true;
            picCargando.Visible = false;

            if (e.Cancelled)
                return;

            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            FrmBalanceAnualVistaPrevia frmBalance = new FrmBalanceAnualVistaPrevia(_reporteAnualCategorias, _reporteAnualEstático, _añoReporte);
            frmBalance.ShowDialog();
        }

        private void btnSubirOrden_Click(object sender, EventArgs e)
        {
            MoverFila(true);            
        }

        private void btnBajarOrden_Click(object sender, EventArgs e)
        {
            MoverFila(false);
        }

        private void dgvCategorias_SelectionChanged(object sender, EventArgs e)
        {
            ValidarSeleccionCategorias();
        }
    }
}
